home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / programs.arc / MENU.PRO < prev    next >
Encoding:
Prolog Source  |  1986-10-07  |  3.0 KB  |  118 lines

  1. /*
  2. This program creates the menu for many of the
  3. sample programs.  You may use it.
  4.  
  5. Call it with the following:
  6.  
  7.      menu(upper_left_x,upper_left_y,[choice_list],choice).
  8.  
  9. Try the goal:
  10.      menu(4,4,[hi,bye,hello,good_bye],Ans).
  11. */
  12.  
  13. DOMAINS
  14.   STRLIST=STRING*
  15.   KEY = cr; esc; break; tab; btab; del; bdel; ins;
  16.         end; home; ftast(INTEGER); up; down; left; right;
  17.         tegn(CHAR); otherspec
  18.  
  19. PREDICATES
  20.   menu(INTEGER,INTEGER,STRLIST,INTEGER)
  21.   readkey(KEY)
  22.   readkey1(KEY,CHAR,INTEGER)
  23.   readkey2(KEY,INTEGER)
  24.  
  25. /* Menu selection */
  26.   maxlen(STRLIST,INTEGER,INTEGER)
  27.   listlen(STRLIST,INTEGER)
  28.   writelist(INTEGER,INTEGER,STRLIST)
  29.   menu1(INTEGER,INTEGER,INTEGER,INTEGER)
  30.   menu2(INTEGER,INTEGER,INTEGER,INTEGER,KEY)
  31.   adjustwindow(INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER)
  32.  
  33.  
  34. CLAUSES
  35.  
  36.   readkey(KEY):-readchar(T),char_int(T,VAL),readkey1(KEY,T,VAL).
  37.  
  38.   readkey1(KEY,_,0):-!,readchar(T),char_int(T,VAL),readkey2(KEY,VAL).
  39.   readkey1(cr,_,13):-!.
  40.   readkey1(esc,_,27):-!.
  41.   readkey1(break,_,3):-!.
  42.   readkey1(tab,_,0):-!.
  43.   readkey1(bdel,_,8):-!.
  44.   readkey1(tegn(T),T,_) .
  45.  
  46.   readkey2(btab,15):-!.
  47.   readkey2(del,83):-!.
  48.   readkey2(ins,82):-!.
  49.   readkey2(up,72):-!.
  50.   readkey2(down,80):-!.
  51.   readkey2(left,75):-!.
  52.   readkey2(right,77):-!.
  53.   readkey2(home,71):-!.
  54.   readkey2(end,79):-!.
  55.   readkey2(ftast(N),VAL):- VAL>58 and VAL<70 and N=VAL-58, !.
  56.   readkey2(otherspec,_).
  57.  
  58.   menu(LI,KOL,LIST,CHOICE) :-
  59.     maxlen(LIST,0,Strln),
  60.     listlen(LIST,Lstlngh), Lstlngh>0,!,
  61.     Strlngh = Strln + 2,
  62.     HH1= Lstlngh+2, HH2=Strlngh + 2,
  63.     adjustwindow(LI,KOL,HH1,HH2,ALI,AKOL),
  64.     makewindow(3,7,7,"",ALI,AKOL,HH1,HH2),
  65.     HH3=Strlngh,
  66.     writelist(0,HH3,LIST),cursor(0,0),
  67.     menu1(0,Lstlngh,Strlngh,CH),
  68.     CHOICE=1+CH,
  69.     removewindow.
  70.  
  71.   menu(_,_,_,255).
  72.  
  73.   maxlen([H|T],MAX,MAX1) :-
  74.         str_len(H,LENGTH),
  75.         LENGTH>MAX,!,
  76.         maxlen(T,LENGTH,MAX1).
  77.   maxlen([_|T],MAX,MAX1) :-maxlen(T,MAX,MAX1).
  78.   maxlen([],LEN,LEN).
  79.  
  80.   listlen([],0).
  81.   listlen([_|T],N):-
  82.         listlen(T,X),
  83.         N=X+1.
  84.  
  85.   writelist(_,_,[]).
  86.   writelist(LI,Strlngh,[H|T]):-field_str(LI,0,Strlngh,H),
  87.         LI1=LI+1,writelist(LI1,Strlngh,T).
  88.  
  89.   menu1(LI,MAXLI,Strlngh,CHOICE):-
  90.         field_attr(LI,0,Strlngh,112),
  91.         cursor(LI,0),
  92.         readkey(KEY),
  93.         menu2(LI,MAXLI,Strlngh,CHOICE,KEY).
  94.  
  95.   menu2(_,_,_,-1,esc):-!.
  96.   menu2(LI,_,_,LI,ftast(10)):-!.
  97.   menu2(LI,_,_,LI,cr):-!.
  98.   menu2(LI,MAXLI,Strlngh,CHOICE,up):-
  99.         LI>0,!,
  100.         field_attr(LI,0,Strlngh,7),
  101.         LI1=LI-1,
  102.         menu1(LI1,MAXLI,Strlngh,CHOICE).
  103.  
  104.   menu2(LI,MAXLI,Strlngh,CHOICE,down):-
  105.         LI<MAXLI-1,!,
  106.         field_attr(LI,0,Strlngh,7),
  107.         LI1=LI+1,
  108.         menu1(LI1,MAXLI,Strlngh,CHOICE).
  109.  
  110.   menu2(LI,MAXLI,Strlngh,CHOICE,_):-
  111.         menu1(LI,MAXLI,Strlngh,CHOICE).
  112.  
  113.   adjustwindow(LI,KOL,DLI,DKOL,LI,KOL):-LI<25-DLI, KOL<80-DKOL,!.
  114.   adjustwindow(LI,_,DLI,DKOL,LI,AKOL):-LI<25-DLI, !, AKOL=80-DKOL.
  115.   adjustwindow(_,KOL,DLI,DKOL,ALI,KOL):-KOL<80-DKOL, !, ALI=25-DLI.
  116.   adjustwindow(_,_,DLI,DKOL,ALI,AKOL):-ALI=25-DLI, AKOL=80-DKOL.
  117.  
  118.